package co.com.bean.zona;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;
import javax.ejb.SessionContext;
import javax.ejb.Stateless;

import co.com.smart.maestro.infraestructure.dto.ResponseJson;
import co.com.smart.maestro.infraestructure.dto.ZonaDTO;
import co.com.smart.mapper.Mapper;
import co.com.smart.persistence.entity.ZonaFacadeLocal;
import co.com.smart.persistence.entity.dto.SmartZona;
import co.com.smart.session.DelegateContextEJB;
import co.com.smart.utilidades.Constantes;

/**
 * Session Bean implementation class ZonaBean
 */
@Stateless(mappedName = "ejb/ZonaBean")
public class ZonaBean implements ZonaBeanLocal{
	private ZonaFacadeLocal facade;
	
	@Resource
	private SessionContext session;
	
	public ZonaBean(){
		facade = DelegateContextEJB.getZonaFacadeLocal();
	}
	
	@Override
	public ResponseJson insertarZona(ZonaDTO zonaDTO) {

		ResponseJson response = new ResponseJson(); 
		try {
			zonaDTO.setCousuario(session.getCallerPrincipal().getName());				
			zonaDTO.setFhingreso(new Date());facade.create(Mapper.mapperDtoToSmartZona(zonaDTO));
			response.setCodigo(Constantes.StatusResponse.OK.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Zona almacenada");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Zona almacenada");
		} catch (Throwable e) {
			response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible almacenar la zona.");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
		}

		return response ;
	}
	
	@Override
	public List<ZonaDTO> consultarAllZona(){
		List<ZonaDTO> zona = new ArrayList<ZonaDTO>();
		for (SmartZona entity : facade.findAll()) {
			if(entity.getSmfhretiro() == null){
				zona.add(Mapper.mapperSmartZonaToDto(entity));
			}
		}

		return zona;
	}

	@Override
	public ZonaDTO consultarZonaId(ZonaDTO zonaDTO) {
		ZonaDTO zona = new ZonaDTO();
		
		SmartZona entity  = facade.find(zonaDTO.getSczona());
		if(entity != null && entity.getSmfhretiro() == null){
			zona = Mapper.mapperSmartZonaToDto(entity);
		}
		return zona;
	}

	@Override
	public ResponseJson editZona(ZonaDTO zona){
		ResponseJson response = new ResponseJson(); 
		try {
			zona.setFhmodificacion(new Date());
			facade.edit(Mapper.mapperDtoToSmartZona(zona));
			response.setCodigo(Constantes.StatusResponse.OK.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Zona editada.");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Zona editada.");
		} catch (Throwable e) {
			response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible editar la zona.");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
		}

		return response ;
	}

	@Override
	public ResponseJson removeZona(ZonaDTO zona,  boolean logic) {
		ResponseJson response = new ResponseJson(); 
		if(logic){
			try {
				zona.setFhretiro(new Date());
				zona.setFhmodificacion(new Date());
				facade.edit(Mapper.mapperDtoToSmartZona(zona));
				response.setCodigo(Constantes.StatusResponse.OK.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Zona inactivada");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Zona inactivado.");
			} catch (Throwable e) {
				response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible inactivar la zona.");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
			}
		}else{
			try {
				facade.remove(Mapper.mapperDtoToSmartZona(zona));
				response.setCodigo(Constantes.StatusResponse.OK.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Zona eliminada");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Zona eliminada.");
			} catch (Throwable e) {
				response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible eliminar la zona.");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
			}
		}
		return response ;
	}
	
	@Override
	public List<ZonaDTO> filtrarzonaxciudad(ZonaDTO zona) {
		List<ZonaDTO> zonafind = new ArrayList<ZonaDTO>();

		for (SmartZona entity :facade.filtrarzonaxciudad(Mapper.mapperDtoToSmartZona(zona))){
			if(entity.getSmfhretiro() == null){
				zonafind.add(Mapper.mapperSmartZonaToDto(entity));
			}
		}

		return zonafind;
	}
}
